ফোরট্রানে Object-Oriented Programming (OOP) এর ধারণা
ফোরট্রান একটি প্রাথমিকভাবে প্রক্রিয়াভিত্তিক ভাষা, তবে আধুনিক ফোরট্রান সংস্করণগুলি (বিশেষ করে Fortran 90 এবং এর পরবর্তী সংস্করণ) অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) সমর্থন করতে সক্ষম হয়েছে। ফোরট্রানে OOP ধারণাটি প্রয়োগ করা সম্ভব এবং এতে ক্লাস, ইনহেরিট্যান্স, পলিমরফিজম, এবং এনক্যাপসুলেশন এর মতো মৌলিক বৈশিষ্ট্য অন্তর্ভুক্ত করা হয়েছে।
ফোরট্রানে OOP ব্যবহারের মাধ্যমে ডেটা এবং ফাংশনগুলিকে একত্রিত করে একটি উন্নত, মডুলার এবং পুনঃব্যবহারযোগ্য প্রোগ্রামিং কাঠামো তৈরি করা সম্ভব। ফোরট্রান 2003 থেকে এই ধারণাটি পূর্ণাঙ্গভাবে সমর্থিত, এবং এটি নতুন প্রোগ্রামিং পদ্ধতি আনার ক্ষেত্রে সহায়ক।
১. ক্লাস (Class)
ফোরট্রানে একটি Class হলো ডেটা এবং কার্যকলাপের একটি কাঠামো যা একত্রে রাখা হয়। ক্লাসে ভেরিয়েবল (প্রোপার্টি) এবং ফাংশন বা সাবরুটিন (মেথড) থাকে। এটি OOP-তে এনক্যাপসুলেশন এর একটি উদাহরণ, যেখানে ডেটা এবং কার্যকলাপ একত্রিত থাকে।
উদাহরণ:
MODULE vehicle_module
TYPE(vehicle)
CHARACTER(LEN=20) :: brand
INTEGER :: year
CONTAINS
PROCEDURE :: set_details
PROCEDURE :: display_details
END TYPE vehicle
CONTAINS
SUBROUTINE set_details(this, brand_name, model_year)
CLASS(vehicle), INTENT(INOUT) :: this
CHARACTER(LEN=20), INTENT(IN) :: brand_name
INTEGER, INTENT(IN) :: model_year
this%brand = brand_name
this%year = model_year
END SUBROUTINE set_details
SUBROUTINE display_details(this)
CLASS(vehicle), INTENT(IN) :: this
PRINT *, 'Brand: ', this%brand
PRINT *, 'Year: ', this%year
END SUBROUTINE display_details
END MODULE vehicle_module
PROGRAM test_vehicle
USE vehicle_module
TYPE(vehicle) :: car
CALL car%set_details('Toyota', 2020)
CALL car%display_details()
END PROGRAM test_vehicleএখানে:
- vehicle নামক একটি ক্লাস তৈরি করা হয়েছে, যাতে দুটি সদস্য (properties):
brandএবংyearরয়েছে। - ক্লাসের মধ্যে দুটি method (
set_detailsএবংdisplay_details) রয়েছে, যা ক্লাসের ডেটা সেট এবং প্রদর্শন করবে।
আউটপুট:
Brand: Toyota
Year: 2020২. ইনহেরিট্যান্স (Inheritance)
ফোরট্রানে ইনহেরিট্যান্স একটি ক্লাস থেকে অন্য ক্লাসের বৈশিষ্ট্য এবং কার্যকলাপের উত্তরাধিকার নেওয়ার প্রক্রিয়া। আপনি একটি বেস ক্লাস তৈরি করতে পারেন এবং সেই ক্লাসের বৈশিষ্ট্য অন্য ক্লাসে উত্তরাধিকারী হিসেবে ব্যবহার করতে পারেন।
উদাহরণ:
MODULE vehicle_module
TYPE, PUBLIC :: vehicle
CHARACTER(LEN=20) :: brand
INTEGER :: year
CONTAINS
PROCEDURE :: set_details
PROCEDURE :: display_details
END TYPE vehicle
TYPE, EXTENDS(vehicle) :: car
CHARACTER(LEN=20) :: fuel_type
CONTAINS
PROCEDURE :: set_car_details
PROCEDURE :: display_car_details
END TYPE car
CONTAINS
SUBROUTINE set_details(this, brand_name, model_year)
CLASS(vehicle), INTENT(INOUT) :: this
CHARACTER(LEN=20), INTENT(IN) :: brand_name
INTEGER, INTENT(IN) :: model_year
this%brand = brand_name
this%year = model_year
END SUBROUTINE set_details
SUBROUTINE display_details(this)
CLASS(vehicle), INTENT(IN) :: this
PRINT *, 'Brand: ', this%brand
PRINT *, 'Year: ', this%year
END SUBROUTINE display_details
SUBROUTINE set_car_details(this, fuel)
CLASS(car), INTENT(INOUT) :: this
CHARACTER(LEN=20), INTENT(IN) :: fuel
this%fuel_type = fuel
END SUBROUTINE set_car_details
SUBROUTINE display_car_details(this)
CLASS(car), INTENT(IN) :: this
CALL this%display_details()
PRINT *, 'Fuel Type: ', this%fuel_type
END SUBROUTINE display_car_details
END MODULE vehicle_module
PROGRAM test_vehicle
USE vehicle_module
TYPE(car) :: my_car
CALL my_car%set_details('Toyota', 2022)
CALL my_car%set_car_details('Gasoline')
CALL my_car%display_car_details()
END PROGRAM test_vehicleএখানে:
carক্লাস,vehicleক্লাস থেকে ইনহেরিট করা হয়েছে।carক্লাসে অতিরিক্ত একটি সদস্যfuel_typeএবং নতুন একটি মেথডset_car_detailsএবংdisplay_car_detailsযোগ করা হয়েছে।
আউটপুট:
Brand: Toyota
Year: 2022
Fuel Type: Gasoline৩. পলিমরফিজম (Polymorphism)
ফোরট্রানে পলিমরফিজম একটি ধারণা, যেখানে একটি ফাংশন বা সাবরুটিন একাধিকভাবে ব্যবহার করা যেতে পারে, যদিও তাদের প্যারামিটার বা কার্যকারিতা আলাদা হতে পারে। ফোরট্রানে এটি CLASS এবং EXTENDS কিওয়ার্ড ব্যবহার করে করা যায়।
উদাহরণ:
MODULE shape_module
TYPE, ABSTRACT :: shape
CONTAINS
PROCEDURE :: area
END TYPE shape
TYPE, EXTENDS(shape) :: circle
REAL :: radius
CONTAINS
PROCEDURE :: area
END TYPE circle
TYPE, EXTENDS(shape) :: rectangle
REAL :: length, width
CONTAINS
PROCEDURE :: area
END TYPE rectangle
CONTAINS
FUNCTION area(this)
CLASS(shape), INTENT(IN) :: this
REAL :: area
area = 0.0
END FUNCTION area
FUNCTION area(this)
CLASS(circle), INTENT(IN) :: this
REAL :: area
area = 3.14159 * this%radius**2
END FUNCTION area
FUNCTION area(this)
CLASS(rectangle), INTENT(IN) :: this
REAL :: area
area = this%length * this%width
END FUNCTION area
END MODULE shape_module
PROGRAM test_shapes
USE shape_module
TYPE(circle) :: c
TYPE(rectangle) :: r
c%radius = 5.0
r%length = 4.0
r%width = 3.0
PRINT *, 'Area of circle: ', area(c)
PRINT *, 'Area of rectangle: ', area(r)
END PROGRAM test_shapesএখানে:
- Shape একটি অ্যাবস্ট্রাক্ট টাইপ (base class) হিসেবে কাজ করে, এবং circle ও rectangle এর মত দুইটি derived class তৈরি করা হয়েছে।
- প্রতিটি ক্লাসে
areaফাংশন পৃথকভাবে কাজ করে, তবে একই নামের ফাংশন ব্যবহার করা হয়েছে (পলিমরফিজম)।
আউটপুট:
Area of circle: 78.539750
Area of rectangle: 12.000000৪. Encapsulation (এনক্যাপসুলেশন)
Encapsulation ফোরট্রানে ক্লাসের ভিতরের ডেটাকে একটি সীমাবদ্ধ পরিবেশে রাখতে এবং বাহ্যিক অ্যাক্সেস কন্ট্রোল করতে সহায়ক। এতে ডেটার নিরাপত্তা নিশ্চিত হয়, কারণ বাহ্যিক কোড সরাসরি ডেটা পরিবর্তন করতে পারে না।
উদাহরণ:
MODULE account_module
TYPE, PUBLIC :: bank_account
REAL :: balance
CONTAINS
PROCEDURE :: deposit
PROCEDURE :: withdraw
PROCEDURE :: get_balance
END TYPE bank_account
CONTAINS
SUBROUTINE deposit(this, amount)
CLASS(bank_account), INTENT(INOUT) :: this
REAL, INTENT(IN) :: amount
this%balance = this%balance + amount
END SUBROUTINE deposit
SUBROUTINE withdraw(this, amount)
CLASS(bank_account), INTENT(INOUT) :: this
REAL, INTENT(IN) :: amount
IF (this%balance >= amount) THEN
this%balance = this%balance - amount
ELSE
PRINT *, 'Insufficient funds!'
END IF
END SUBROUTINE withdraw
FUNCTION get_balance(this) RESULT(balance)
CLASS(bank_account), INTENT(IN) :: this
REAL :: balance
balance = this%balance
END FUNCTION get_balance
END MODULE account_module
PROGRAM test_account
USE account_module
TYPE(bank_account) :: my_account
CALL my_account%deposit(500.0)
CALL my_account%withdraw(200.0)
PRINT *, 'Balance: ', my_account%get_balance()
END PROGRAM test_accountএখানে:
bank_accountক্লাসের ভিতরের ডেটা (যেমন ব্যালেন্স) শুধুমাত্র মেথডের মাধ্যমে অ্যাক্সেস এবং পরিবর্তন করা যায়।
আউটপুট:
Balance: 300.000000উপসংহার
ফোরট্রানে Object-Oriented Programming (OOP) ধারণা ব্যবহার করে ডেটা এবং কার্যকলাপ একত্রিত করা যায়, যার মাধ্যমে কোড আরও মডুলার, পুনঃব্যবহারযোগ্য এবং রক্ষণাবেক্ষণযোগ্য হয়। ফোরট্রানে OOP এর মৌলিক ধারণাগুলি অন্তর্ভুক্ত রয়েছে:
- ক্লাস (Class): ডেটা এবং ফাংশনের সমন্বয়।
- ইনহেরিট্যান্স (Inheritance): এক ক্লাস থেকে অন্য ক্লাসের বৈশিষ্ট্য অর্জন।
- পলিমরফিজম (Polymorphism): একাধিক ফাংশন বা সাবরুটিনের ব্যবহার।
- এনক্যাপসুলেশন (Encapsulation): ডেটাকে সুরক্ষিত রাখা এবং বাহ্যিক অ্যাক্সেস নিয়ন্ত্রণ করা।
ফোরট্রানে OOP ব্যবহার করে আরও উন্নত, সংগঠিত এবং নির্ভুল কোড লেখা সম্ভব।
Read more